home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / musicali / psmp.lha / PSMP / src / psmp_0.9.s
Text File  |  1997-01-14  |  41KB  |  2,070 lines

  1. ;
  2. ; "PSMP"  Play Sample
  3. ; -------------------
  4. ; by Smack/Infect
  5. ;
  6. ;
  7. ; REQUIRES: OS V37+
  8. ;
  9. ;
  10. ; V0.1 (Wednesday 17-Jul-96)
  11. ;   -first version
  12. ;       play uncompressed IFF-8SVX on all 4 channels
  13. ;       audio.device for allocating channels
  14. ;       hardware hits: level 4 irq, filter, audio
  15. ;
  16. ; V0.2 (Tue 01-Oct-96)
  17. ;   -support compressed samples (1=Fibonacci Delta, 2=Exponential Delta)
  18. ;   -"PLAYBACKRATE" option
  19. ;   -exec interrupt handler (INTB_AUD0)
  20. ;
  21. ; V0.3 (Sat 05-Oct-96)
  22. ;   -support XPK compressed samples (using XpkOpen(), XpkRead() etc.)
  23. ;   -runtime controls:
  24. ;     CTRL-F = toggle filter
  25. ;     CTRL-E = repeat mode off
  26. ;     CTRL-D = repeat mode on
  27. ;     CTRL-C = exit immediately
  28. ;
  29. ; V0.4 (Thu 10-Oct-96)
  30. ;   -replaced 68020+ instructions (MUL/DIV) by utility.library calls
  31. ;
  32. ; V0.5 (Fri 25-Oct-96)
  33. ;   -support stereo samples
  34. ;   -better handling of "loading not ready in time"-situations
  35. ;    (now there is a silent gap instead of playing "trash")
  36. ;   -major internal cleanups
  37. ;
  38. ; V0.6 (Wed 06-Nov-96)
  39. ;   -added Workbench startup
  40. ;   -fixed Signal()/Wait() calls (use signalmask instead of signalnumber!)
  41. ;   -fixed handling of odd chunksizes
  42. ;
  43. ; V0.7 (Sat 16-Nov-96)
  44. ;   -added "SMALLWINDOW" and "LOADALL" options/tooltypes
  45. ;
  46. ; V0.8 (Sat 07-Dec-96)
  47. ;   -fixed argument parsing
  48. ;   -added progressbar
  49. ;   -removed "SMALLWINDOW" (by default output to shell and progressbar)
  50. ;   -added options "NOPROGRESS", "NOINFO", "PUBSCREEN"
  51. ;
  52. ; V0.9 (Tue 14-Jan-97)
  53. ;   -errors (open file, 8SVX format check) now cause reqtools-filerequester
  54. ;   -changed look of progress window slightly
  55.  
  56.  
  57.  
  58. buffersize=32*1024    ;must be below 64K
  59.     incdir    includes:
  60.     include    libraries/xpk.i
  61.     include    os_macros.is
  62.     include    hardware-registers.is
  63.     include    dos/dos.i
  64.     include    dos/dosextens.i
  65.  
  66.  
  67.     STRUCTURE myFH,0
  68.     ULONG    mfh_fh        ;(must be the first item!!)
  69.     UWORD    mfh_is_xpk    ;if non-zero then XPK
  70.     ULONG    mfh_filepos    ;XPK only - position in file
  71.     APTR    mfh_xbuff    ;XPK only - address of decrunch buffer
  72.     ULONG    mfh_xbuffsize    ;XPK only - size of decrunch buffer (=XPK chunksize)
  73.     APTR    mfh_buffpos    ;XPK only - current position in decrunch buffer
  74.     ULONG    mfh_buffcontent    ;XPK only - current content of decrunch buffer
  75.     APTR    mfh_filename    ;(must be the last item!!)
  76.     LABEL    mfh_SIZEOF
  77.  
  78.     section    aaaa,code
  79. first_
  80.     basereg    first_,a4
  81.     lea    (first_,pc),a4
  82. ;--------------------------------------
  83. ; open libs
  84.     move.l    (4.w),a6
  85.     move.l    (378,a6),a0    ;LibList
  86.     lea    (dosnam,pc),a1
  87.     CALL    FindName        ;DOS
  88.     move.l    d0,(dosbase,a4)
  89.     move.l    (378,a6),a0    ;LibList
  90.     lea    (gfxnam,pc),a1
  91.     CALL    FindName        ;GFX
  92.     move.l    d0,(gfxbase,a4)
  93.     move.l    (378,a6),a0    ;LibList
  94.     lea    (intuinam,pc),a1
  95.     CALL    FindName        ;INTUITION
  96.     move.l    d0,(intuitionbase,a4)
  97.     lea    (utilnam,pc),a1
  98.     moveq    #37,d0
  99.     CALL    OpenLibrary        ;UTILITY
  100.     move.l    d0,(utilitybase,a4)
  101.     beq.w    err_ende
  102.     lea    (iconnam,pc),a1
  103.     moveq    #37,d0
  104.     CALL    OpenLibrary        ;ICON
  105.     move.l    d0,(iconbase,a4)
  106.     beq.w    err_ende
  107.  
  108.  
  109. ;--------------------------------------
  110. ; handle arguments
  111.     sub.l    a1,a1
  112.     CALL    FindTask
  113.     move.l    d0,a5
  114.     tst.l    (172,a5)    ;pr_CLI
  115.     bne.b    .from_cli
  116.     lea    (92,a5),a0    ;pr_MsgPort
  117.     CALL    WaitPort
  118.     lea    (92,a5),a0    ;pr_MsgPort
  119.     CALL    GetMsg            ;workbench msg
  120.     move.l    d0,(wbmsg,a4)
  121.     bra.b    .not_cli
  122. .from_cli
  123.     lea    (template,pc),a0
  124.     move.l    a0,d1
  125.     lea    (filenamept,pc),a0
  126.     move.l    a0,d2
  127.     moveq    #0,d3
  128.     CALLDOS    ReadArgs        ;read command line args
  129.     move.l    d0,(rdargs,a4)
  130.     bne.b    .args_ok
  131.     lea    (args_start,pc),a0
  132.     lea    (args_end,pc),a1
  133. .argclr    clr.l    (a0)+
  134.     cmp.l    a0,a1
  135.     bne.b    .argclr
  136. .args_ok
  137. .not_cli
  138.  
  139.     move.l    (wbmsg,pc),d0
  140.     beq.w    .not_wb
  141.     move.l    d0,a5            ;a5=wbmsg
  142.     move.l    (36,a5),a3    ;sm_ArgList
  143.     move.l    (a3),d1        ;wa_Lock
  144.     CALLDOS    CurrentDir
  145.     move.l    d0,(oldcurrdir,a4)
  146.     move.l    (4,a3),a0    ;wa_Name
  147.     CALLICON GetDiskObject        ;read program's icon
  148.     move.l    d0,d7
  149.     beq.b    .no_icon1
  150.     bsr.b    .read_tooltypes
  151.     move.l    d7,a0
  152.     CALL    FreeDiskObject
  153. .no_icon1
  154.     move.l    (28,a5),d0    ;sm_NumArgs
  155.     subq.l    #1,d0
  156.     beq.b    .no_icon2
  157.     move.l    (36,a5),a3    ;sm_ArgList
  158.     move.l    (8,a3),d1    ;wa_sizeof+wa_Lock
  159.     CALLDOS    CurrentDir
  160.     move.l    (12,a3),a1    ;wa_sizeof+wa_Name
  161.     move.l    a1,a0
  162.     move.l    (filenamebuffpt,pc),a2
  163.     move.l    a2,(filenamept,a4)
  164. .cloo    move.b    (a1)+,(a2)+
  165.     bne.b    .cloo
  166.     CALLICON GetDiskObject        ;read sample's icon
  167.     move.l    d0,d7
  168.     beq.b    .no_icon2
  169.     bsr.b    .read_tooltypes
  170.     move.l    d7,a0
  171.     CALL    FreeDiskObject
  172. .no_icon2
  173.     bra.w    .not_wb
  174. .read_tooltypes
  175.     move.l    d7,a0
  176.     move.l    ($36,a0),a3    ;a3=do_ToolTypes
  177.     move.l    a3,a0        ;PLAYBACKRATE
  178.     lea    (tt_rate,pc),a1
  179.     CALL    FindToolType
  180.     move.l    d0,d1
  181.     lea    (rate_arg,pc),a0
  182.     move.l    a0,d2
  183.     move.l    a0,(playbackrate,a4)
  184.     CALLDOS    StrToLong
  185.     move.l    a3,a0        ;FILTER
  186.     lea    (tt_filter,pc),a1
  187.     CALLICON FindToolType
  188.     move.l    d0,(filter,a4)
  189.     move.l    a3,a0        ;REPEAT
  190.     lea    (tt_repeat,pc),a1
  191.     CALL    FindToolType
  192.     move.l    d0,(repeat,a4)
  193.     move.l    a3,a0        ;INFO
  194.     lea    (tt_info,pc),a1
  195.     CALL    FindToolType
  196.     move.l    d0,(info,a4)
  197.     move.l    a3,a0        ;LOADALL
  198.     lea    (tt_loadall,pc),a1
  199.     CALL    FindToolType
  200.     move.l    d0,(loadall,a4)
  201.     move.l    a3,a0        ;NOPROGRESS
  202.     lea    (tt_noprogress,pc),a1
  203.     CALL    FindToolType
  204.     move.l    d0,(noprogress,a4)
  205.     move.l    a3,a0        ;NOINFO
  206.     lea    (tt_noinfo,pc),a1
  207.     CALL    FindToolType
  208.     move.l    d0,(noinfo,a4)
  209.     move.l    a3,a0        ;PUBSCREEN
  210.     lea    (tt_pubscreen,pc),a1
  211.     CALL    FindToolType
  212.     tst.l    d0
  213.     beq.b    .nops
  214.     move.l    d0,a0
  215.     lea    (psnam),a1
  216.     move.l    a1,(pubscrnam,a4)
  217. .pscopy    move.b    (a0)+,(a1)+
  218.     bne.b    .pscopy
  219. .nops    rts
  220. .not_wb
  221.  
  222.     move.l    (noinfo,pc),d0
  223.     bne.b    .noinfo
  224.     CALLDOS    Output
  225.     move.l    d0,(output,a4)        ;output
  226.     bne.b    .output_ok
  227.     lea    (connam,pc),a0
  228.     move.l    a0,d1
  229.     move.l    #MODE_OLDFILE,d2
  230.     CALL    Open            ;open own window
  231.     move.l    d0,(output,a4)
  232.     move.l    d0,(conwindow,a4)
  233. .output_ok
  234.     move.l    (output,pc),d1
  235.     lea    (maintxt,pc),a0
  236.     move.l    a0,d2
  237.     CALLDOS    FPutS            ;print title string
  238.     tst.l    (wbmsg,a4)
  239.     bne.b    .info
  240.     tst.l    (rdargs,a4)
  241.     bne.b    .info
  242.     move.l    (output,pc),d1
  243.     lea    (argwarntxt,pc),a0
  244.     move.l    a0,d2
  245.     CALL    FPutS
  246.     bra.b    .info
  247. .noinfo
  248.     clr.l    (info,a4)
  249. .info
  250.     move.l    (playbackrate,pc),d0
  251.     beq.b    .norate_arg
  252.     move.l    d0,a0
  253.     move.l    (a0),d0
  254.     ble.b    .norate_arg
  255.     move.l    d0,(rate_arg,a4)
  256. .norate_arg
  257.  
  258.     tst.l    (filenamept,a4)
  259.     bne.w    skipfilerequester
  260. dofilerequester
  261.     moveq    #38,d0
  262.     lea    (rtnam,pc),a1
  263.     CALLEXEC OpenLibrary        ;V38 reqtools.library
  264.     tst.l    d0
  265.     beq.w    ende
  266.     move.l    d0,a6
  267.     moveq    #0,d0        ;RT_FILEREQ
  268.     sub.l    a0,a0
  269.     CALL    rtAllocRequestA
  270.     tst.l    d0
  271.     beq.w    err_ende
  272.     move.l    d0,a5
  273.     lea    (filereqtags,pc),a0
  274.     move.l    a5,a1
  275.     move.l    (lbuffpt,pc),a2
  276.     lea    (filereqtitle,pc),a3
  277.     CALL    rtFileRequestA
  278.     move.l    (16,a5),a0    ;filereq->dir
  279.     move.l    (filenamebuffpt,pc),a1
  280.     clr.l    (a1)
  281. .dircop    move.b    (a0)+,(a1)+
  282.     bne.b    .dircop
  283.     move.l    a6,d7
  284.     move.l    (filenamebuffpt,pc),d1
  285.     move.l    (lbuffpt,pc),d2
  286.     move.l    #1024,d3
  287.     CALLDOS    AddPart
  288.     move.l    d7,a6
  289.     move.l    (filenamebuffpt,pc),(filenamept,a4)
  290.     move.l    a5,a1
  291.     CALL    rtFreeRequest
  292.     move.l    a6,a1
  293.     CALLEXEC CloseLibrary
  294.     move.l    (filenamebuffpt,pc),a0
  295.     tst.l    (a0)
  296.     beq.w    ende            ;cancelled or empty string
  297. skipfilerequester
  298.  
  299. ;--------------------------------------
  300. ; init file
  301.     move.l    (dosbase,pc),a6
  302.     move.l    #"FORM",d6        ;!!!!!
  303.     move.l    #"8SVX",d7        ;!!!!!
  304.  
  305.     move.l    (loadall,pc),d0
  306.     beq.w    .notloadall
  307.  
  308.     ;----LOADALL
  309.     move.l    (filenamept,pc),d1
  310.     move.l    #MODE_OLDFILE,d2
  311.     CALL    Open
  312.     move.l    d0,d5
  313.     beq.w    dofilerequester
  314.     move.l    d5,d1
  315.     move.l    (buff1pt,pc),d2
  316.     move.l    d2,a5
  317.     moveq    #32,d3
  318.     CALL    Read
  319.     move.l    d0,d4        ;read error
  320.     move.l    d5,d1
  321.     move.l    (buff2pt,pc),d2
  322.     CALL    ExamineFH
  323.     move.l    d5,d1
  324.     move.l    d0,d5        ;examine error
  325.     CALL    Close
  326.     tst.l    d4
  327.     bmi.w    ifferr        ;ENDSTREAMCH
  328.     tst.l    d5
  329.     beq.w    ifferr        ;DOSFALSE
  330.  
  331.     move.l    (buff1pt,pc),a0
  332.     cmp.l    #"XPKF",(a0)
  333.     bne.b    .notxpk
  334.     add    #16,a0
  335. .notxpk    cmp.l    (a0),d6
  336.     bne.w    ifferr
  337.     cmp.l    (8,a0),d7    ;FORM 8SVX ?
  338.     bne.w    ifferr
  339.  
  340.     move.l    (buff2pt,pc),a0
  341.     move.l    (108+16,a0),d5    ;fib.Size
  342.     ble.w    ifferr
  343.     move.l    d5,d0
  344.     moveq    #0,d1
  345.     CALLEXEC AllocVec
  346.     move.l    d0,(loadallvec,a4)
  347.     bne.b    .memok
  348.     clr.l    (loadall,a4)
  349.     bra.b    .notloadall
  350.  
  351. .memok    move.l    (filenamept,pc),d1
  352.     move.l    #MODE_OLDFILE,d2
  353.     CALLDOS    Open
  354.     move.l    d0,d4
  355.     beq.w    err_ende
  356.     move.l    d0,d1
  357.     move.l    (loadallvec,pc),d2
  358.     move.l    d5,d3
  359.     CALL    Read
  360.     move.l    d4,d1
  361.     move.l    d0,d4        ;read error
  362.     CALL    Close
  363.     cmp.l    d4,d5
  364.     bne.w    readerr
  365.     move.l    #XPK_InBuf,(xpkopentags,a4)
  366.     move.l    (loadallvec,pc),(xpkopentags+4,a4)
  367.     move.l    #XPK_InLen,(xot_inlen,a4)
  368.     move.l    d5,(xot_inlen+4,a4)
  369. .notloadall
  370.  
  371.     ;----not LOADALL
  372. xopen_again
  373.     lea    (smpfh1,pc),a0
  374.     move.l    (filenamept,pc),(mfh_filename,a0)
  375.     bsr.w    _XOpen
  376.     tst.l    d0
  377.     beq.b    openok
  378. handle_xopen_error
  379.     addq.l    #1,d0
  380.     bne.b    not___1
  381.     bra.w    dofilerequester
  382.  
  383. putstr    move.l    a0,d2
  384.     move.l    (output,pc),d1
  385.     CALLDOS    FPutS
  386.     bra.w    err_ende
  387.  
  388. not___1
  389.     addq.l    #1,d0
  390.     bne.b    not___2
  391.     lea    (xpknam,pc),a1        ;-2
  392.     moveq    #2,d0
  393.     CALLEXEC OpenLibrary
  394.     move.l    d0,(xpkbase,a4)
  395.     bne.b    xopen_again
  396.     lea    (xpkliberrtxt,pc),a0
  397.     bra.b    putstr
  398. not___2
  399.     addq.l    #1,d0
  400.     bne.b    not___3
  401. xpkerr    lea    (xpkerrtxt,pc),a0    ;-3,  global "print xpk error"
  402.     move.l    a0,d2
  403.     lea    (xpkerrtxtargs,pc),a0
  404.     move.l    a0,d3
  405.     move.l    (output,pc),d1
  406.     CALLDOS    VFPrintf
  407.     bra.w    err_ende
  408. not___3
  409.     addq.l    #1,d0
  410.     bne.w    err_ende
  411. memerr    lea    (memerrtxt,pc),a0    ;-4,  global "print mem error"
  412.     bra.b    putstr
  413. openok
  414.     ;---check IFF-8SVX
  415.     lea    (smpfh1,pc),a0
  416.     move.l    (buff1pt,pc),d2
  417.     moveq    #12,d3
  418.     bsr.w    _XRead
  419.     cmp.l    d0,d3
  420.     bne.b    ifferr
  421.     move.l    (buff1pt,pc),a0
  422.     cmp.l    (a0),d6            ;!!!!!
  423.     bne.b    ifferr
  424.     cmp.l    (8,a0),d7        ;!!!!!
  425.     beq.b    form_ok
  426. ifferr    bra.w    dofilerequester
  427. form_ok
  428.     ;---read VHDR, CHAN, move to beginning of BODY
  429. chunkloop
  430.     lea    (smpfh1,pc),a0
  431.     move.l    (buff1pt,pc),d2
  432.     moveq    #8,d3
  433.     bsr.w    _XRead
  434.     cmp.l    d0,d3
  435.     bne.b    ifferr
  436.     move.l    (buff1pt,pc),a0
  437.  
  438.     cmp.l    #"VHDR",(a0)        ;---VHDR
  439.     bne.b    .not_vhdr
  440.     move.l    a0,d2
  441.     move.l    (4,a0),d3
  442.     lea    (smpfh1,pc),a0
  443.     bsr.w    _XRead            ;len should be 20
  444.     cmp.l    d0,d3
  445.     bne.b    ifferr
  446.     move.l    (buff1pt,pc),a0
  447.     move    (12,a0),(rate+2,a4)        ;vh_SamplesPerSec
  448.     move.b    (15,a0),(compression+1,a4)    ;vh_Compression
  449.     bra.b    chunkloop
  450. .not_vhdr
  451.     cmp.l    #"CHAN",(a0)        ;---CHAN
  452.     bne.b    .not_chan
  453.     move.l    a0,d2
  454.     move.l    (4,a0),d3
  455.     lea    (smpfh1,pc),a0
  456.     bsr.w    _XRead            ;len should be 4
  457.     cmp.l    d0,d3
  458.     bne.b    ifferr
  459.     move.l    (buff1pt,pc),a0
  460.     cmp.l    #6,(a0)
  461.     bne.b    .not_st
  462.     st    (is_stereo,a4)
  463. .not_st    bra.b    chunkloop
  464. .not_chan
  465.     cmp.l    #"BODY",(a0)        ;---BODY
  466.     beq.b    .is_body
  467.  
  468.     move.l    (4,a0),d2        ;---skip other chunks
  469.     addq.l    #1,d2
  470.     lsr.l    #1,d2
  471.     add.l    d2,d2            ;round up to even length!!
  472.     moveq    #OFFSET_CURRENT,d3
  473.     lea    (smpfh1,pc),a0
  474.     bsr.w    _XSeek
  475.     bra.w    chunkloop
  476.  
  477. .is_body
  478.     move.l    (4,a0),d0
  479.     move.l    d0,(bodyend,a4)
  480.     move.l    d0,(bodylen,a4)
  481.     lea    (smpfh1,pc),a0
  482.     moveq    #0,d2
  483.     moveq    #OFFSET_CURRENT,d3
  484.     bsr.w    _XSeek
  485.     move.l    d0,(bodystart,a4)
  486.     move.l    d0,(currpos,a4)
  487.     add.l    d0,(bodyend,a4)
  488.  
  489.     move.l    (output,pc),d1
  490.     lea    (filetxt,pc),a0
  491.     move.l    a0,d2
  492.     lea    (filenamept,pc),a0
  493.     move.l    a0,d3
  494.     CALLDOS    VFPrintf
  495.  
  496. ;--------------------------------------
  497. ; calc some things and print info text
  498.     tst.l    (rate_arg,a4)    ;option PLAYBACKRATE?
  499.     bne.b    .pbrate_arg
  500.     move.l    (rate,pc),(rate_arg,a4)
  501. .pbrate_arg
  502.     move.l    (4.w),a1
  503.     move.l    (568,a1),d7    ;ex_EClockFrequency
  504.     move.l    d7,d0
  505.     lsl.l    #2,d7
  506.     add.l    d0,d7        ;ex_EClockFrequency*5
  507.     move.l    (rate_arg,pc),d6
  508.     move.l    d7,d0
  509.     move.l    d6,d1
  510.     CALLUTIL UDivMod32
  511.     lsr.l    #1,d6
  512.     cmp.l    d6,d1        ;remainder
  513.     ble.b    .no_r_u
  514.     addq    #1,d0        ;round result up
  515. .no_r_u    move    d0,(rate_amiga,a4)
  516.     move.l    d0,d1
  517.     move.l    d7,d0
  518.     CALL    UDivMod32
  519.     move.l    d0,(rate_play,a4)
  520.  
  521.     move.l    (bodylen,pc),d0
  522.     tst    (compression,a4)
  523.     beq.b    .nocomp
  524.     add.l    d0,d0
  525. .nocomp    tst    (is_stereo,a4)
  526.     beq.b    .noster
  527.     lsr.l    #1,d0
  528. .noster    move.l    d0,(bytestoplay,a4)
  529.     move.l    (rate_play,pc),d7
  530.     move.l    d7,d1
  531.     CALL    UDivMod32
  532.     divu    #60,d0
  533.     move    d0,(minutes,a4)
  534.     swap    d0
  535.     move    d0,(seconds,a4)
  536.     move.l    #1000,d0
  537.     CALL    UMult32
  538.     move.l    d7,d1
  539.     CALL    UDivMod32
  540.     move    d0,(millisec,a4)
  541.  
  542.     lea    (comp0txt,pc),a0    ;none
  543.     move    (compression,pc),d0
  544.     beq.b    .cstr
  545.     lea    (comp1txt,pc),a0    ;Fibonacci Delta
  546.     subq    #1,d0
  547.     beq.b    .cstr
  548.     lea    (comp2txt,pc),a0    ;Exponential Delta
  549.     subq    #1,d0
  550.     beq.b    .cstr
  551.     lea    (comperrtxt,pc),a0    ;unknown compression
  552.     bra.w    putstr
  553. .cstr    move.l    a0,(compstr,a4)
  554.  
  555.     lea    (monotxt,pc),a0
  556.     tst    (is_stereo,a4)
  557.     beq.b    .ststr
  558.     lea    (stereotxt,pc),a0
  559. .ststr    move.l    a0,(stereostr,a4)
  560.  
  561.     move.l    (bodylen,pc),d0
  562.     moveq    #10,d1
  563.     lsr.l    d1,d0
  564.     move.l    d0,(bodylenKB,a4)
  565.  
  566.     tst    (smpfh1+mfh_is_xpk,a4)
  567.     beq.b    .not_xpk
  568.     move.l    (smpfh1+mfh_fh,pc),a0
  569.     move.l    (xf_Packer,a0),(packername,a4)
  570.     move.l    (xf_Ratio,a0),(packerratio,a4)
  571.     move.l    (xf_NLen,a0),d0
  572.     moveq    #10,d1
  573.     lsr.l    d1,d0
  574.     move.l    d0,(packerchszKB,a4)
  575.     lea    (xpktxt,pc),a0
  576.     move.l    a0,d2
  577.     lea    (xpktxt_args,pc),a0
  578.     move.l    a0,d3
  579.     move.l    (output,pc),d1
  580.     CALLDOS    VFPrintf
  581. .not_xpk
  582.     lea    (infotxt,pc),a0
  583.     move.l    a0,d2
  584.     lea    (infotxt_args,pc),a0
  585.     move.l    a0,d3
  586.     move.l    (output,pc),d1
  587.     CALLDOS    VFPrintf
  588.  
  589.  
  590.     tst.l    (info,a4)
  591.     bne.w    ende
  592.  
  593. ;--------------------------------------
  594. ; setup audio
  595.     CALLEXEC CreateMsgPort
  596.     move.l    d0,(msgport,a4)
  597.     beq.b    .audioerr
  598.  
  599.     move.l    d0,a0        ;msg port
  600.     moveq    #62,d0        ;ioa_sizeof
  601.     CALL    CreateIORequest
  602.     move.l    d0,(ioreq,a4)
  603.     beq.b    .audioerr
  604.  
  605.     move.l    d0,a1
  606.     move.b    #127,(9,a1)    ;channel pri
  607.     lea    (channelmap,pc),a0
  608.     move.l    a0,(34,a1)    ;ioa_data
  609.     moveq    #2,d0
  610.     move.l    d0,(38,a1)    ;ioa_length
  611.     lea    (audionam,pc),a0
  612.     moveq    #0,d0        ;unit
  613.     moveq    #0,d1        ;flags
  614.     CALL    OpenDevice
  615.     tst.l    d0
  616.     bne.b    .audioerr
  617.     st    (audioopen,a4)
  618.     bra.b    .audiook
  619. .audioerr
  620.     lea    (audioerrtxt,pc),a0
  621.     bra.w    putstr
  622. .audiook
  623. qqq1
  624.  
  625. ;--------------------------------------
  626. ; fill buffer the first time
  627.     move.l    (bodyend,pc),d0
  628.     sub.l    (bodystart,pc),d0
  629.     move.l    #buffersize*2,d3
  630.     move    (compression,pc),d7
  631.     beq.b    .nocom1
  632.     lsr.l    #1,d3        ;half loading size
  633. .nocom1
  634.     tst    (is_stereo,a4)
  635.     beq.b    .noster
  636.     lsr.l    #1,d0
  637. .noster
  638.     cmp.l    d3,d0
  639.     bge.b    .large
  640.  
  641.     st    (playmode,a4)        ;small
  642.     move.l    d0,d3
  643.     tst    d7
  644.     beq.b    .nocom2
  645.     add.l    d0,d0        ;double playing size
  646. .nocom2    move.l    d0,(buff1size,a4)
  647.     move.l    d0,(buff2size,a4)
  648.     move.l    (buff1pt,pc),(buff2pt,a4)
  649.     bra.b    .readit
  650. .large    lsr.l    #1,d3            ;large
  651. .readit
  652.     lea    (smpfh1,pc),a0
  653.     move.l    (buff1pt,pc),d2
  654.     tst    d7
  655.     beq.b    .nocom3
  656.     move.l    (lbuffpt,pc),d2
  657. .nocom3    bsr.w    _XRead
  658.     cmp.l    d0,d3
  659.     bne.b    readerr
  660.     add.l    d0,(currpos,a4)
  661.     bra.b    qqq2
  662. readerr
  663.     tst.l    (xpk_error,a4)
  664.     bne.w    xpkerr
  665.     lea    (readerrtxt,pc),a0
  666.     bra.w    putstr
  667. qqq2
  668.     move    d7,d1            ;comp_type
  669.     beq.b    .nocom4
  670.     move.l    (lbuffpt,pc),a0        ;inbuf
  671.     move.l    (buff1pt,pc),a1        ;outbuf
  672.     move    (a0)+,d2        ;initial value
  673.     move    d2,(a1)+
  674.     subq.l    #2,d0            ;inlen
  675.     bsr.w    decompress_4bit_delta
  676.     move.b    d0,(initial_value,a4)
  677. .nocom4
  678.  
  679. ;--------------------------------------
  680. ; prepare stereo
  681.     tst    (is_stereo,a4)
  682.     beq.w    .no_stereo
  683.  
  684.     lea    (smpfh2,pc),a0
  685.     move.l    (filenamept,pc),(mfh_filename,a0)
  686.     bsr.w    _XOpen            ;open file a second time
  687.     tst.l    d0
  688.     bne.w    handle_xopen_error
  689.  
  690.     move.l    #buffersize*2,d0
  691.     moveq    #2,d1            ;MEMF_CHIP
  692.     CALLEXEC AllocVec        ;alloc second chip buffer
  693.     move.l    d0,(buffspt,a4)
  694.     beq.w    memerr
  695.     move.l    d0,(buffs1pt,a4)
  696.     add.l    #buffersize,d0
  697.     move.l    d0,(buffs2pt,a4)
  698.  
  699.     lea    (smpfh2,pc),a0
  700.     move.l    (bodylen,pc),d2
  701.     lsr.l    #1,d2
  702.     add.l    (bodystart,pc),d2
  703.     move.l    d2,(stereostart,a4)
  704.     moveq    #OFFSET_CURRENT,d3
  705.     bsr.w    _XSeek            ;seek to half of BODY
  706.  
  707.     move.l    (buff1size,pc),(buffs1size,a4)
  708.     move.l    (buff2size,pc),(buffs2size,a4)
  709.     tst    (playmode,a4)
  710.     beq.b    .large
  711.     move.l    (buffs1pt,pc),(buffs2pt,a4)
  712. .large
  713.     move.l    (buffs1size,pc),d3
  714.     move.l    (buffs1pt,pc),d2
  715.     move    (compression,pc),d7
  716.     beq.b    .nocom1
  717.     lsr.l    #1,d3        ;half loading size
  718.     move.l    (lbuffpt,pc),d2
  719. .nocom1
  720.     lea    (smpfh2,pc),a0
  721.     bsr.w    _XRead
  722.     cmp.l    d0,d3
  723.     bne.w    readerr
  724.  
  725.     move    d7,d1            ;comp_type
  726.     beq.b    .nocom3
  727.     move.l    (lbuffpt,pc),a0        ;inbuf
  728.     move.l    (buffs1pt,pc),a1    ;outbuf
  729.     move    (a0)+,d2        ;initial value
  730.     move    d2,(a1)+
  731.     subq.l    #2,d0            ;inlen
  732.     bsr.w    decompress_4bit_delta
  733.     move.b    d0,(initial_value2,a4)
  734. .nocom3
  735. .no_stereo
  736.     
  737. ;--------------------------------------
  738. ; init progress indicator window
  739.     move.l    (noprogress,pc),d0
  740.     bne.w    noprogresswin
  741.     move.l    (filenamept,pc),d1
  742.     CALLDOS    FilePart
  743.     move.l    d0,(filepart,a4)
  744.     move.l    (pubscrnam,pc),d0
  745.     beq.b    .defps
  746.     move.l    d0,a0
  747.     CALLINT    LockPubScreen
  748.     move.l    d0,(pubscreen,a4)
  749.     bne.b    .psok
  750.     move.l    (output,pc),d1
  751.     lea    (pubscrtxt,pc),a0
  752.     move.l    a0,d2
  753.     lea    (pubscrnam,pc),a0
  754.     move.l    a0,d3
  755.     CALLDOS    VFPrintf
  756. .defps    sub.l    a0,a0
  757.     CALLINT    LockPubScreen        ;lock default public screen
  758.     move.l    d0,(pubscreen,a4)
  759.     beq.w    err_ende
  760. .psok    move.l    d0,a0
  761.     move.l    a0,(owt_pubscr+4,a4)
  762.  
  763.     move.l    (40,a0),a0    ;screen.sc_Font
  764.     moveq    #0,d1
  765.     move    (4,a0),d1    ;screen.sc_Font->ta_YSize
  766.     move.l    d1,(fontheight,a4)
  767.     move.l    d1,d0
  768.     add.l    d1,d0
  769.     lsl.l    #2,d1
  770.     add.l    d1,d0
  771.     move.l    d0,(owt_height+4,a4)    ;6*fontheight
  772.  
  773.     move.l    (pubscreen,pc),a1
  774.     add    #84,a1        ;screen.sc_RastPort
  775.     move.l    a1,d7
  776.     lea    (timetxt,pc),a0
  777.     moveq    #timetxtlen,d0
  778.     CALLGFX    TextLength        ;fit timetxt-width
  779.     move.l    d0,(timetxtwidth,a4)
  780.     add.l    d0,d0
  781.     cmp.l    (owt_width+4,pc),d0
  782.     bmi.b    .nw1
  783.     move.l    d0,(owt_width+4,a4)
  784. .nw1    move.l    (filepart,pc),a0
  785.     move.l    a0,a2
  786.     moveq    #-1,d0
  787. .count    addq.l    #1,d0
  788.     tst.b    (a2)+
  789.     bne.b    .count
  790.     move.l    d0,(filepartlen,a4)
  791.     move.l    d7,a1
  792.     CALL    TextLength        ;fit filename-width
  793.     move.l    d0,(filepartwidth,a4)
  794.     add.l    d0,d0
  795.     cmp.l    (owt_width+4,pc),d0
  796.     bmi.b    .nw2
  797.     move.l    d0,(owt_width+4,a4)
  798. .nw2
  799.     move.l    (pubscreen,pc),a0
  800.     move    (12,a0),d0    ;screen.sc_Width
  801.     sub    (owt_width+6,pc),d0
  802.     bmi.b    .nwc
  803.     lsr    #1,d0
  804.     move    d0,(owt_left+6,a4)
  805. .nwc    move    (14,a0),d0    ;screen.sc_Height
  806.     sub    (owt_height+6,pc),d0
  807.     bmi.b    .nhc
  808.     lsr    #1,d0
  809.     move    d0,(owt_top+6,a4)
  810. .nhc
  811.     sub.l    a0,a0
  812.     lea    (openwindow_tags,pc),a1
  813.     CALLINT    OpenWindowTagList
  814.     move.l    d0,(intuiwindow,a4)
  815.     beq.w    err_ende
  816.     move.l    d0,a5
  817.     CALLEXEC Disable
  818.     move.l    (86,a5),a5    ;window.wd_UserPort
  819.     move.b    #1,(14,a5)    ;window.wd_UserPort->mp_Flags=PA_SOFTINT
  820.     lea    (idcmp_softint,pc),a1
  821.     move.l    a1,(16,a5)    ;window.wd_UserPort->mp_SigTask/mp_SoftInt
  822.     CALL    Enable
  823.  
  824.     move.l    (intuiwindow,pc),a5
  825.     move.l    (50,a5),d7    ;window.wd_RPort !!!
  826.     move.l    d7,a1
  827.     moveq    #1,d0        ;JAM2
  828.     CALLGFX    SetDrMd
  829.     move.l    d7,a1
  830.     moveq    #0,d0
  831.     CALL    SetBPen
  832.     move.l    d7,a1
  833.     move.l    (pubscreen,pc),a0
  834.     move.l    (84+52,a0),a0    ;screen.RastPort.TextFont
  835.     CALL    SetFont
  836.  
  837.     move.l    d7,a1
  838.     moveq    #3,d0
  839.     CALL    SetAPen
  840.     move.l    d7,a1
  841.     moveq    #0,d0
  842.     moveq    #0,d1
  843.     moveq    #0,d2
  844.     move    (112,a5),d2    ;window.wd_GZZWidth
  845.     moveq    #0,d3
  846.     move    (114,a5),d3    ;window.wd_GZZHeight
  847.     CALL    RectFill
  848.  
  849.     moveq    #0,d0
  850.     move    (112,a5),d0    ;window.wd_GZZWidth
  851.     subq    #1,d0
  852.     move.l    d0,d2        ;!!!
  853.     move.l    d0,d1
  854.     divu    #25,d1
  855.     swap    d1
  856.     clr    d1
  857.     swap    d1
  858.     move.l    d1,(pbleft,a4)
  859.     sub.l    d1,d0
  860.     move.l    d0,(pbright,a4)
  861.     move.l    (fontheight,pc),d0
  862.     move.l    d0,d1
  863.     move.l    d0,d3
  864.     lsr.l    #1,d3        ;!!!
  865.     add.l    d1,d1
  866.     add.l    d3,d1
  867.     move.l    d1,(pbtop,a4)
  868.     add.l    d0,d1        ;!!!
  869.     move.l    d1,(pbbot,a4)
  870.     sub.l    (timetxtwidth,pc),d2    ;!!!
  871.     lsr.l    #1,d2
  872.     move.l    d2,(timetxtx,a4)
  873.     add.l    d0,d1            ;!!!
  874.     add.l    d3,d1
  875.     move.l    d1,(timetxty,a4)
  876.  
  877.     move.l    d7,a1
  878.     move.l    (pbleft,pc),d0
  879.     lsr.l    #1,d0
  880.     move.l    d0,a3
  881.     move.l    (fontheight,pc),d1
  882.     lsr.l    #1,d1
  883.     move.l    d1,d5
  884.     move.l    (pbright,pc),d2
  885.     add.l    d0,d2
  886.     move.l    d2,d4
  887.     move.l    (timetxty,pc),d3
  888.     add.l    d1,d3
  889.     move.l    d3,d6
  890.     CALL    EraseRect
  891.  
  892.     move.l    d7,a1
  893.     moveq    #2,d0
  894.     CALL    SetAPen
  895.     move.l    d7,a1
  896.     move.l    a3,d0
  897.     move.l    d6,d1
  898.     CALL    Move
  899.     move.l    d7,a1
  900.     move.l    a3,d0
  901.     move.l    d5,d1
  902.     CALL    Draw
  903.     move.l    d7,a1
  904.     move.l    d4,d0
  905.     move.l    d5,d1
  906.     CALL    Draw
  907.     move.l    d7,a1
  908.     moveq    #1,d0
  909.     CALL    SetAPen
  910.     move.l    d7,a1
  911.     move.l    d4,d0
  912.     move.l    d6,d1
  913.     CALL    Draw
  914.     move.l    d7,a1
  915.     move.l    a3,d0
  916.     move.l    d6,d1
  917.     CALL    Draw
  918.  
  919.     moveq    #0,d0
  920.     move    (112,a5),d0    ;window.wd_GZZWidth
  921.     sub.l    (filepartwidth,pc),d0
  922.     bge.b    .fpw
  923.     moveq    #0,d0
  924. .fpw    lsr.l    #1,d0        ;x
  925.     move.l    (fontheight,pc),d1
  926.     add.l    d1,d1        ;y
  927.     move.l    d7,a1
  928.     CALL    Move
  929.     move.l    d7,a1
  930.     move.l    (filepart,pc),a0
  931.     move.l    (filepartlen,pc),d0
  932.     CALL    Text
  933.  
  934.     move.l    (pbright,pc),d1
  935.     sub.l    (pbleft,pc),d1
  936.     subq.l    #2,d1
  937.     move.l    d1,(pbwidth,a4)
  938.     move.l    (bytestoplay,pc),d0
  939.     CALLUTIL UDivMod32
  940.     move.l    d0,(bytestoplay,a4)
  941.     moveq    #"0",d3
  942.     moveq    #0,d1
  943.     moveq    #1,d2
  944.     move    (minutes,pc),d0
  945. .min    subq    #1,d0
  946.     bmi.b    .mine
  947.     abcd    d2,d1
  948.     bra.b    .min
  949. .mine    move    d1,d0
  950.     lsr    #4,d0
  951.     add    d3,d0
  952.     move.b    d0,(timetxt_tm,a4)
  953.     and    #$f,d1
  954.     add    d3,d1
  955.     move.b    d1,(timetxt_tm+1,a4)
  956.     moveq    #0,d1
  957.     move    (seconds,pc),d0
  958. .sec    subq    #1,d0
  959.     bmi.b    .sece
  960.     abcd    d2,d1
  961.     bra.b    .sec
  962. .sece    move    d1,d0
  963.     lsr    #4,d0
  964.     add    d3,d0
  965.     move.b    d0,(timetxt_ts,a4)
  966.     and    #$f,d1
  967.     add    d3,d1
  968.     move.b    d1,(timetxt_ts+1,a4)
  969.  
  970.     move.l    d7,a1
  971.     move.l    (timetxtx,pc),d0
  972.     move.l    (timetxty,pc),d1
  973.     CALLGFX    Move
  974.     move.l    d7,a1
  975.     lea    (timetxt,pc),a0
  976.     moveq    #timetxtlen,d0
  977.     CALL    Text
  978.  
  979.     move.l    d7,a1
  980.     move.l    (pbleft,pc),d0
  981.     move.l    (pbbot,pc),d1
  982.     CALL    Move
  983.     move.l    d7,a1
  984.     move.l    (pbleft,pc),d0
  985.     move.l    (pbtop,pc),d1
  986.     CALL    Draw
  987.     move.l    d7,a1
  988.     move.l    (pbright,pc),d0
  989.     move.l    (pbtop,pc),d1
  990.     CALL    Draw
  991.     move.l    d7,a1
  992.     moveq    #2,d0
  993.     CALL    SetAPen
  994.     move.l    d7,a1
  995.     move.l    (pbright,pc),d0
  996.     move.l    (pbbot,pc),d1
  997.     CALL    Draw
  998.     move.l    d7,a1
  999.     move.l    (pbleft,pc),d0
  1000.     move.l    (pbbot,pc),d1
  1001.     CALL    Draw
  1002. noprogresswin
  1003.  
  1004. ;--------------------------------------
  1005. ; setup timing
  1006.     moveq    #-1,d0
  1007.     CALLEXEC AllocSignal
  1008.     move.l    d0,(signal,a4)        ;own signal
  1009.     moveq    #-1,d1
  1010.     cmp.l    d0,d1
  1011.     beq.w    err_ende
  1012.     sub.l    a1,a1
  1013.     CALL    FindTask
  1014.     move.l    d0,(mytask,a4)        ;own task
  1015.     move.l    d0,a1
  1016.     moveq    #10,d0
  1017.     CALL    SetTaskPri
  1018.     move.l    d0,(oldpri,a4)
  1019.  
  1020.     lea    ($dff000),a5
  1021.     move    #$780,d0
  1022.     move    d0,(intena,a5)
  1023.     move    d0,(intreq,a5)        ;audio irqs off
  1024.     moveq    #7,d0        ;INTB_AUD0
  1025.     lea    (int_struct,pc),a1
  1026.     CALL    SetIntVector
  1027.     move.l    d0,(oldlevel4,a4)
  1028.     move    #$8080,d0
  1029.     move    d0,(intena,a5)
  1030.     move    d0,(intreq,a5)        ;audio irq 0 on
  1031.  
  1032. ;--------------------------------------
  1033. mainloop
  1034.     clr    (read_busy,a4)
  1035.     move.l    #$0000f000,d7    ;break signals
  1036.     move.l    (signal,pc),d1    ;signalnumber
  1037.     moveq    #1,d0
  1038.     lsl.l    d1,d0
  1039.     or.l    d7,d0        ;signalmask
  1040.     CALLEXEC Wait
  1041.     move.l    d0,d6
  1042.     and.l    d7,d0
  1043.     beq.b    .nobreak
  1044.  
  1045.     rol    #4,d0        ;lsr #12
  1046.     moveq    #8,d1        ;CTRL-F
  1047.     and    d0,d1
  1048.     beq.b    .no_ctrlf
  1049.     lea    ($bfe001),a0
  1050.     lea    (filter,pc),a1
  1051.     tst.l    (a1)
  1052.     bne.b    .filter_is_on
  1053.     st    (a1)
  1054.     bclr    #1,(a0)        ;filter on
  1055.     bra.b    .no_ctrlf
  1056. .filter_is_on
  1057.     clr.l    (a1)
  1058.     bset    #1,(a0)        ;filter off
  1059. .no_ctrlf
  1060.     moveq    #4,d1        ;CTRL-E
  1061.     and    d0,d1
  1062.     beq.b    .no_ctrle
  1063.     clr.l    (repeat,a4)    ;repeat mode off
  1064. .no_ctrle
  1065.     moveq    #2,d1        ;CTRL-D
  1066.     and    d0,d1
  1067.     beq.b    .no_ctrld
  1068.     st    (repeat,a4)    ;repeat mode on
  1069. .no_ctrld
  1070.     moveq    #1,d1        ;CTRL-C
  1071.     and    d0,d1
  1072.     bne.w    ende
  1073.     not.l    d7
  1074.     and.l    d7,d6
  1075.     beq.b    mainloop    ;no other signal (for loading)
  1076. .nobreak
  1077.     tst    (playmode,a4)
  1078.     bne.b    mainloop    ;small sample
  1079.  
  1080.  
  1081.     moveq    #0,d7        ;!!!!
  1082.     st    (read_busy,a4)
  1083.  
  1084.  
  1085.     move.l    d7,-(a7)
  1086.     move.l    (intuiwindow,pc),d0    ;---progress indicator
  1087.     beq.w    .noprogress
  1088.     move.l    d0,a0
  1089.     move.l    (50,a0),a5    ;window.wd_RPort
  1090.     move.l    (playedbytes,pc),d0
  1091.     move.l    (bytestoplay,pc),d1
  1092.     CALLUTIL UDivMod32
  1093.     move.l    (pbwidth,pc),d1
  1094.     cmp.l    d0,d1
  1095.     bge.b    .prwok
  1096.     move.l    d1,d0
  1097. .prwok    move.l    d0,d7
  1098.     move.l    (pbcurrent,pc),d6
  1099.     move.l    d0,(pbcurrent,a4)
  1100.     move.l    (pbleft,pc),d0
  1101.     addq.l    #1,d0
  1102.     add.l    d0,d6
  1103.     add.l    d0,d7
  1104.     move.l    (gfxbase,pc),a6    ;!!!
  1105.     cmp.l    d6,d7        ;clear?
  1106.     bge.b    .prdraw
  1107.     moveq    #1,d6
  1108.     add.l    (pbleft,pc),d6
  1109.     move.l    a5,a1
  1110.     moveq    #0,d0
  1111.     CALL    SetAPen
  1112.     move.l    a5,a1
  1113.     move.l    (pbleft,pc),d0
  1114.     move.l    (pbtop,pc),d1
  1115.     move.l    (pbright,pc),d2
  1116.     move.l    (pbbot,pc),d3
  1117.     addq.l    #1,d0
  1118.     addq.l    #1,d1
  1119.     subq.l    #1,d2
  1120.     subq.l    #1,d3
  1121.     CALL    RectFill
  1122. .prdraw    move.l    a5,a1        ;draw
  1123.     moveq    #3,d0
  1124.     CALL    SetAPen
  1125.     move.l    d6,d0
  1126.     move.l    (pbtop,pc),d1
  1127.     addq.l    #1,d1
  1128.     move.l    d7,d2
  1129.     move.l    (pbbot,pc),d3
  1130.     subq.l    #1,d3
  1131.     CALL    RectFill
  1132.  
  1133. .prtime    move.l    (playedbytes,pc),d0
  1134.     move.l    (rate_play,pc),d1
  1135.     CALLUTIL UDivMod32
  1136.     divu    #60,d0
  1137.     move    d0,(timemin,a4)
  1138.     swap    d0
  1139.     move    d0,(timesec,a4)
  1140.     moveq    #"0",d7
  1141.     moveq    #0,d1
  1142.     moveq    #1,d2
  1143. .prsec    subq    #1,d0
  1144.     bmi.b    .prsece
  1145.     abcd    d2,d1
  1146.     bra.b    .prsec
  1147. .prsece    move    d1,d0
  1148.     lsr    #4,d0
  1149.     add    d7,d0
  1150.     move.b    d0,(timetxt_cs,a4)
  1151.     and    #$f,d1
  1152.     add    d7,d1
  1153.     move.b    d1,(timetxt_cs+1,a4)
  1154.     swap    d0
  1155.     moveq    #0,d1
  1156. .prmin    subq    #1,d0
  1157.     bmi.b    .prmine
  1158.     abcd    d2,d1
  1159.     bra.b    .prmin
  1160. .prmine    move    d1,d0
  1161.     lsr    #4,d0
  1162.     add    d7,d0
  1163.     move.b    d0,(timetxt_cm,a4)
  1164.     and    #$f,d1
  1165.     add    d7,d1
  1166.     move.b    d1,(timetxt_cm+1,a4)
  1167.  
  1168.     move.l    a5,a1
  1169.     moveq    #1,d0
  1170.     CALLGFX    SetAPen
  1171.     move.l    a5,a1
  1172.     move.l    (timetxtx,pc),d0
  1173.     move.l    (timetxty,pc),d1
  1174.     CALL    Move
  1175.     move.l    a5,a1
  1176.     lea    (timetxt,pc),a0
  1177.     moveq    #timetxtlen,d0
  1178.     CALL    Text
  1179. .noprogress
  1180.     move.l    (a7)+,d7
  1181.  
  1182.  
  1183.  
  1184.     move.l    (bodyend,pc),d0
  1185.     tst    (is_stereo,a4)
  1186.     beq.b    .noste1
  1187.     lsr.l    #1,d0
  1188. .noste1
  1189.     sub.l    (currpos,pc),d0
  1190.     bmi.w    readerr
  1191.     bgt.b    .noseek
  1192.  
  1193.     ;---seek to start
  1194.     lea    (oneshot_last,pc),a0
  1195.     st    (a0)
  1196.     tst.l    (repeat,a4)
  1197.     beq.w    mainloop
  1198.     clr    (a0)
  1199.  
  1200.     clr.l    (playedbytes,a4)
  1201.     clr    (timemin,a4)
  1202.     clr    (timesec,a4)
  1203.  
  1204.     lea    (smpfh1,pc),a0
  1205.     move.l    (bodystart,pc),d2
  1206.     move.l    d2,(currpos,a4)
  1207.     moveq    #OFFSET_BEGINNING,d3
  1208.     bsr.w    _XSeek            ;seek to start of BODY
  1209.     tst.l    d0
  1210.     bmi.w    readerr
  1211.  
  1212.     tst    (is_stereo,a4)
  1213.     beq.b    .nost
  1214.     lea    (smpfh2,pc),a0
  1215.     move.l    (stereostart,pc),d2
  1216.     moveq    #OFFSET_BEGINNING,d3
  1217.     bsr.w    _XSeek            ;seek to half of BODY
  1218.     tst.l    d0
  1219.     bmi.w    readerr
  1220. .nost    move.l    #buffersize,d0
  1221.     moveq    #1,d7        ;!!!!
  1222. .noseek
  1223.  
  1224.     ;---read and decompress
  1225.     move.l    #buffersize,d3
  1226.     move.l    (buff1pt,pc),d2
  1227.     tst    (compression,a4)
  1228.     beq.b    .nocom1
  1229.     lsr.l    #1,d3
  1230.     move.l    (lbuffpt,pc),d2
  1231. .nocom1
  1232.     cmp.l    d0,d3
  1233.     ble.b    .read
  1234.     move.l    d0,d3
  1235. .read    lea    (smpfh1,pc),a0
  1236.     bsr.w    _XRead
  1237.     cmp.l    d0,d3
  1238.     bne.w    readerr
  1239.     add.l    d0,(currpos,a4)
  1240.     move.l    d0,(buff1size,a4)
  1241.     move    (compression,pc),d1    ;comp_type
  1242.     beq.b    .check_stereo
  1243.     add.l    d0,(buff1size,a4)
  1244.     move.l    (lbuffpt,pc),a0        ;inbuf
  1245.     move.l    (buff1pt,pc),a1        ;outbuf
  1246.     move.b    (initial_value,pc),d2
  1247.     tst.l    d7        ;!!!!
  1248.     beq.b    .not_start
  1249.     move    (a0)+,d2        ;initial value
  1250.     move    d2,(a1)+
  1251.     subq.l    #2,d0            ;inlen
  1252. .not_start
  1253.     bsr.w    decompress_4bit_delta
  1254.     move.b    d0,(initial_value,a4)
  1255.  
  1256. .check_stereo
  1257.     tst    (is_stereo,a4)
  1258.     beq.w    mainloop
  1259.     lea    (smpfh2,pc),a0
  1260.     move.l    (buff1size,pc),d3    ;len from other side
  1261.     move.l    (buffs1pt,pc),d2
  1262.     tst    (compression,a4)
  1263.     beq.b    .nocom2
  1264.     lsr.l    #1,d3
  1265.     move.l    (lbuffpt,pc),d2
  1266. .nocom2    bsr.w    _XRead
  1267.     cmp.l    d0,d3
  1268.     bne.w    readerr
  1269.     move.l    d0,(buffs1size,a4)
  1270.     move    (compression,pc),d1    ;comp_type
  1271.     beq.w    mainloop
  1272.     add.l    d0,(buffs1size,a4)
  1273.     move.l    (lbuffpt,pc),a0        ;inbuf
  1274.     move.l    (buffs1pt,pc),a1    ;outbuf
  1275.     move.b    (initial_value2,pc),d2
  1276.     tst.l    d7        ;!!!!
  1277.     beq.b    .not_start2
  1278.     move    (a0)+,d2        ;initial value
  1279.     move    d2,(a1)+
  1280.     subq.l    #2,d0            ;inlen
  1281. .not_start2
  1282.     bsr.w    decompress_4bit_delta
  1283.     move.b    d0,(initial_value2,a4)
  1284.     bra.w    mainloop
  1285.  
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291. ;--------------------------------------
  1292. ; some global routines
  1293.  
  1294.  
  1295. check_idcmp    ;(called from MsgPort-SoftInt)
  1296.     movem.l    d1-a6,-(a7)
  1297.     move.l    (intuiwindow,pc),a0
  1298.     move.l    (86,a0),a0    ;window.wd_UserPort
  1299.     CALLEXEC GetMsg
  1300.     tst.l    d0
  1301.     beq.b    .exit
  1302.     move.l    d0,a5
  1303.     move.l    (20,a5),d0    ;msg.Class
  1304.     move    #$200,d1
  1305.     and    d0,d1
  1306.     beq.b    .notclosegadget
  1307.     moveq    #1,d0
  1308.     ror    #4,d0            ;Ctrl-C
  1309.     move.l    (mytask,pc),a1
  1310.     CALL    Signal
  1311. .notclosegadget
  1312.     move.l    a5,a1
  1313.     CALL    ReplyMsg
  1314. .exit    movem.l    (a7)+,d1-a6
  1315.     moveq    #0,d0
  1316.     rts
  1317.  
  1318.  
  1319.  
  1320.  
  1321. mylevel4    ;-----------
  1322.     movem.l    d1-a6,-(a7)
  1323.     lea    ($dff000),a5
  1324.     lea    (first_,pc),a4
  1325.  
  1326.     lea    ($bfe001),a0
  1327.     tst.l    (filter,a4)
  1328.     beq.b    .filteroff
  1329.     bclr    #1,(a0)        ;filter on
  1330.     bra.b    .skipfilter
  1331. .filteroff
  1332.     bset    #1,(a0)        ;filter off
  1333. .skipfilter
  1334.     move    #$00ff,(adkcon,a5)
  1335.     move    (rate_amiga,pc),d0
  1336.     move    d0,(aud0per,a5)
  1337.     move    d0,(aud1per,a5)
  1338.     move    d0,(aud2per,a5)
  1339.     move    d0,(aud3per,a5)
  1340.  
  1341.     moveq    #64,d0
  1342.     tst    (read_busy,a4)
  1343.     beq.b    .volume
  1344.     moveq    #0,d0
  1345. .volume    move    d0,(aud0vol,a5)
  1346.     move    d0,(aud1vol,a5)
  1347.     move    d0,(aud2vol,a5)
  1348.     move    d0,(aud3vol,a5)
  1349.     tst    d0
  1350.     beq.w    .end
  1351.  
  1352.     move    #$000f,(dmacon,a5)    ;dma off
  1353.     move.l    (buff1pt,pc),d0
  1354.     move.l    d0,d1
  1355.     move.l    (buff1size,pc),d2
  1356.     move.l    d2,d3
  1357.     lsr.l    #1,d2
  1358.     tst    (is_stereo,a4)
  1359.     beq.b    .noster
  1360.     move.l    (buffs1pt,pc),d1
  1361.     move.l    (buffs1size,pc),d3
  1362. .noster    lsr.l    #1,d3
  1363.     move.l    d0,(aud0lch,a5)    
  1364.     move.l    d1,(aud1lch,a5)
  1365.     move.l    d1,(aud2lch,a5)
  1366.     move.l    d0,(aud3lch,a5)
  1367.     move    d2,(aud0len,a5)
  1368.     move    d3,(aud1len,a5)
  1369.     move    d3,(aud2len,a5)
  1370.     move    d2,(aud3len,a5)
  1371.  
  1372.     moveq    #8,d0
  1373.     bsr.b    .wait_hsync
  1374.     move    #$800f,(dmacon,a5)    ;dma on
  1375.     moveq    #8,d0
  1376.     bsr.b    .wait_hsync
  1377.  
  1378.     move.l    (buff2size,pc),d0
  1379.     add.l    d0,(playedbytes,a4)
  1380.  
  1381.     move.l    (buff1pt,pc),d0
  1382.     move.l    (buff2pt,pc),(buff1pt,a4)
  1383.     move.l    d0,(buff2pt,a4)
  1384.     move.l    (buff1size,pc),d0
  1385.     move.l    (buff2size,pc),(buff1size,a4)
  1386.     move.l    d0,(buff2size,a4)
  1387.  
  1388.     move.l    (buffs1pt,pc),d0
  1389.     move.l    (buffs2pt,pc),(buffs1pt,a4)
  1390.     move.l    d0,(buffs2pt,a4)
  1391.     move.l    (buffs1size,pc),d0
  1392.     move.l    (buffs2size,pc),(buffs1size,a4)
  1393.     move.l    d0,(buffs2size,a4)
  1394.  
  1395.     move.l    (repeat,pc),d7        ;loop
  1396.     tst    (playmode,a4)
  1397.     beq.b    .large
  1398.  
  1399.     tst    (firstirq,a4)
  1400.     bne.b    .notfirst
  1401.     st    (firstirq,a4)
  1402.     bra.b    .end
  1403.  
  1404. .wait_hsync    ;-----------------
  1405. ; d0=number_of_syncs   a5=$dff000
  1406. .outer    move.b    (6,a5),d1
  1407. .inner    cmp.b    (6,a5),d1
  1408.     beq.b    .inner
  1409.     subq    #1,d0
  1410.     bgt.b    .outer
  1411.     rts
  1412.  
  1413. .notfirst
  1414.     moveq    #1,d0
  1415.     ror    #4,d0
  1416.     tst.l    d7            ;loop?
  1417.     beq.b    .do_signal        ;no -> break
  1418.     bra.b    .end            ;yes -> no signal
  1419. .large
  1420.     move.l    (signal,pc),d1
  1421.     moveq    #1,d0
  1422.     lsl.l    d1,d0
  1423.     tst    (oneshot_last,a4)
  1424.     beq.b    .do_signal
  1425.     tst.l    d7
  1426.     bne.b    .do_signal
  1427.     moveq    #1,d0
  1428.     ror    #4,d0            ;break signals
  1429.  
  1430. .do_signal
  1431.     move.l    (mytask,pc),a1
  1432.     CALLEXEC Signal
  1433. .end
  1434.     move    #$780,(intreq,a5)
  1435.     movem.l    (a7)+,d1-a6
  1436.     moveq    #0,d0
  1437.     nop
  1438.     rts
  1439.  
  1440.  
  1441.  
  1442. ;***Decompress_4bit_Delta*******************************************
  1443. ; parameters:
  1444. ;  d0 - inlen (must be EVEN)
  1445. ;  d1 - comp_type (1 or 2)
  1446. ;  d2 - initial value
  1447. ;  a0 - inbuff
  1448. ;  a1 - outbuff
  1449. ; result:
  1450. ;  d0 - last value (initial value for next call)
  1451. decompress_4bit_delta
  1452.     movem.l    d1-a6,-(a7)
  1453.     lea    (fib_tab,pc),a2
  1454.     subq.b    #1,d1
  1455.     beq.b    .fib
  1456.     lea    (exp_tab,pc),a2
  1457. .fib    moveq    #0,d1
  1458.     moveq    #$0f,d5
  1459. .loop    move.b    (a0)+,d1
  1460.     move.l    d1,d3
  1461.     lsr    #4,d1
  1462.     add.b    (a2,d1.l),d2
  1463.     move.b    d2,d4
  1464.     lsl    #8,d4
  1465.     and    d5,d3
  1466.     add.b    (a2,d3.l),d2
  1467.     move.b    d2,d4
  1468.     swap    d4
  1469.     move.b    (a0)+,d1
  1470.     move.l    d1,d3
  1471.     lsr    #4,d1
  1472.     add.b    (a2,d1.l),d2
  1473.     move.b    d2,d4
  1474.     lsl    #8,d4
  1475.     and    d5,d3
  1476.     add.b    (a2,d3.l),d2
  1477.     move.b    d2,d4
  1478.     move.l    d4,(a1)+    ;LONG writes to the fucking slow ChipRAM
  1479.     subq.l    #2,d0        ;inlen is EVEN
  1480.     bgt.b    .loop
  1481.     move.l    d2,d0
  1482.     movem.l    (a7)+,d1-a6
  1483.     rts
  1484. fib_tab    dc.b    -34,-21,-13,-8,-5,-3,-2,-1,0,1,2,3,5,8,13,21
  1485. exp_tab    dc.b    -128,-64,-32,-16,-8,-4,-2,-1,0,1,2,4,8,16,32,64
  1486.  
  1487.  
  1488.  
  1489.  
  1490. ;***_XOpen**********************************************************
  1491. ; parameters:
  1492. ;  a0 - myFH (mfh_filename must have been initialized!)
  1493. ; result:
  1494. ;  d0 - 0=OK, other=ERROR
  1495. ; -DOSBase must be valid
  1496. ; -if file starts with "XPKF" and XPKBase=NULL
  1497. ;    -> result=-2 -> call _XOpen again when xpkmaster.library was opened
  1498. _xopen
  1499.     movem.l    d1-a6,-(a7)
  1500.     move.l    a0,a5
  1501.  
  1502.     moveq    #mfh_SIZEOF-5,d0    ;don't clear mfh_filename !!
  1503. .clrloo    clr.b    (a0)+
  1504.     dbf    d0,.clrloo
  1505.  
  1506.     move.l    (loadall,pc),d0
  1507.     beq.b    .notloadall
  1508.     move.l    (loadallvec,pc),a0
  1509.     cmp.l    #"XPKF",(a0)
  1510.     beq.b    .xla
  1511.     bra.w    .end_ok
  1512. .notloadall
  1513.  
  1514.     move.l    (mfh_filename,a5),d1
  1515.     move.l    #MODE_OLDFILE,d2
  1516.     CALLDOS    Open
  1517.     move.l    d0,(a5)
  1518.     bne.b    .open_ok
  1519.     moveq    #-1,d0            ;-1=DOS_OPEN_ERROR
  1520.     bra.w    .exit
  1521. .open_ok
  1522.     move.l    d0,d1
  1523.     lea    (.xpkf_test,pc),a0
  1524.     move.l    a0,d2
  1525.     moveq    #4,d3
  1526.     CALL    Read
  1527.  
  1528.     move.l    (.xpkf_test,pc),d0
  1529.     cmp.l    #"XPKF",d0
  1530.     beq.b    .is_xpk
  1531.     move.l    (a5),d1
  1532.     moveq    #0,d2
  1533.     moveq    #OFFSET_BEGINNING,d3
  1534.     CALL    Seek
  1535.     bra.b    .end_ok
  1536.  
  1537. .is_xpk
  1538.     move.l    (a5),d1
  1539.     CALL    Close
  1540.     clr.l    (a5)
  1541. .xla    move.l    (xpkbase,pc),d0
  1542.     bne.b    .xpklib_ok
  1543.     moveq    #-2,d0            ;-2=XPKMASTER_NOT_OPEN
  1544.     bra.b    .exit
  1545. .xpklib_ok
  1546.     move.l    d0,a6
  1547.     move.l    a5,a0
  1548.     lea    (xpkopentags,pc),a1
  1549.     tst.l    (loadall,a4)
  1550.     bne.b    .la
  1551.     move.l    (mfh_filename,a5),(4,a1)
  1552. .la    CALL    XpkOpen
  1553.     move.l    d0,(xpk_error,a4)
  1554.     beq.b    .xpkopen_ok
  1555.     moveq    #-3,d0            ;-3=XPK_ERROR
  1556.     bra.b    .exit
  1557. .xpkopen_ok
  1558.     st    (mfh_is_xpk,a5)
  1559.     move.l    (a5),a0
  1560.     move.l    (xf_NLen,a0),d0
  1561.     move.l    d0,(mfh_xbuffsize,a5)
  1562.     add.l    #XPK_MARGIN,d0
  1563.     moveq    #0,d1
  1564.     CALLEXEC AllocVec
  1565.     move.l    d0,(mfh_xbuff,a5)
  1566.     bne.b    .end_ok
  1567.     moveq    #-4,d0            ;-4=MEM_ERROR
  1568.     bra.b    .exit
  1569.  
  1570. .end_ok    moveq    #0,d0
  1571. .exit    movem.l    (a7)+,d1-a6
  1572.     rts
  1573.  
  1574. .xpkf_test    dc.l    0
  1575. xpkopentags    dc.l    XPK_InName,0    ;to be patched!
  1576.         dc.l    XPK_GetError,xpkerrormsg
  1577.         dc.l    XPK_ShortError,-1
  1578. xot_inlen    dc.l    0,0,0
  1579.  
  1580.  
  1581.  
  1582.  
  1583. ;***_XRead**********************************************************
  1584. ; parameters:
  1585. ;  a0 - myFH
  1586. ;  d2 - buffer
  1587. ;  d3 - len
  1588. ; result:
  1589. ;  d0 - bytes read (0=EOF, <0=ERROR)
  1590. _xread
  1591.     movem.l    d1-a6,-(a7)
  1592.     move.l    a0,a5        ;myFH
  1593.     tst    (mfh_is_xpk,a5)
  1594.     bne.b    .is_xpk
  1595.     move.l    (loadall,pc),d0
  1596.     beq.b    .nla
  1597.     move.l    (mfh_filepos,a5),a0
  1598.     add.l    (loadallvec,pc),a0
  1599.     move.l    d2,a1
  1600.     move.l    d3,d0
  1601.     add.l    d0,(mfh_filepos,a5)
  1602.     CALLEXEC CopyMem
  1603.     move.l    d3,d0
  1604.     bra.b    .exit
  1605. .nla    move.l    (a0),d1        ;mfh_fh
  1606.     CALLDOS    Read
  1607. .exit    movem.l    (a7)+,d1-a6
  1608.     rts
  1609. .is_xpk    move.l    d2,d6    ;buf
  1610.     move.l    d3,d7    ;len
  1611.     moveq    #0,d5    ;already read
  1612. .xloop    tst.l    d7
  1613.     bgt.b    .go_on
  1614. .eof    move.l    d5,d0
  1615.     add.l    d0,(mfh_filepos,a5)
  1616.     bra.b    .exit
  1617. .go_on    move.l    (mfh_buffcontent,a5),d0
  1618.     ble.b    .read
  1619.     sub.l    d0,d7
  1620.     bge.b    .copy
  1621.     add.l    d0,d7
  1622.     move.l    d7,d0
  1623.     moveq    #0,d7
  1624. .copy    move.l    (mfh_buffpos,a5),a0
  1625.     move.l    d6,a1
  1626.     add.l    d0,d5
  1627.     add.l    d0,(mfh_buffpos,a5)
  1628.     add.l    d0,d6
  1629.     sub.l    d0,(mfh_buffcontent,a5)
  1630.     CALLEXEC CopyMem
  1631.     bra.b    .xloop
  1632. .read    move.l    (a5),a0        ;mfh_fh
  1633.     move.l    (mfh_xbuff,a5),a1
  1634.     move.l    a1,(mfh_buffpos,a5)
  1635.     move.l    (mfh_xbuffsize,a5),d0
  1636.     CALLXPK    XpkRead
  1637.     move.l    d0,(mfh_buffcontent,a5)
  1638.     beq.b    .eof
  1639.     bgt.b    .xloop
  1640.     move.l    d0,(xpk_error,a4)
  1641.     bra.b    .exit
  1642.  
  1643.  
  1644. ;***_XSeek**********************************************************
  1645. ; parameters:
  1646. ;  a0 - myFH
  1647. ;  d2 - newpos (only positive numbers (forward seeking) supported)
  1648. ;  d3 - offset (only OFFSET_BEGINNING and OFFSET_CURRENT supported)
  1649. ; result:
  1650. ;  d0 - oldpos (<0=ERROR)
  1651. _xseek
  1652.     movem.l    d1-a6,-(a7)
  1653.     move.l    a0,a5            ;myFH
  1654.     tst    (mfh_is_xpk,a5)
  1655.     bne.b    .is_xpk
  1656.     move.l    (loadall,pc),d0
  1657.     beq.b    .nla
  1658.     move.l    (mfh_filepos,a5),d0    ;oldpos
  1659.     tst.l    d3
  1660.     beq.b    .offcur
  1661.     clr.l    (mfh_filepos,a5)
  1662. .offcur    add.l    d2,(mfh_filepos,a5)
  1663.     bra.b    .exit
  1664. .nla    move.l    (a5),d1
  1665.     CALLDOS    Seek
  1666. .exit    movem.l    (a7)+,d1-a6
  1667.     rts
  1668. .is_xpk    move.l    d2,d6            ;newpos
  1669.     move.l    (mfh_filepos,a5),d7    ;oldpos
  1670.     tst.l    d3            ;offset
  1671.     beq.b    .seek_loop        ;OFFSET_CURRENT
  1672.  
  1673.     move.l    (a5),a0
  1674.     CALLXPK    XpkClose
  1675.     clr.l    (a5)
  1676.     clr.l    (mfh_filepos,a5)
  1677.     clr.l    (mfh_buffcontent,a5)
  1678.     move.l    a5,a0
  1679.     lea    (xpkopentags,pc),a1
  1680.     tst.l    (loadall,a4)
  1681.     bne.b    .la
  1682.     move.l    (mfh_filename,a5),(4,a1)
  1683. .la    CALL    XpkOpen            ;"seek" to beginning
  1684.     move.l    d0,(xpk_error,a4)
  1685.     beq.b    .seek_loop
  1686.     moveq    #-1,d0            ;ERROR
  1687.     bra.b    .exit
  1688. .seek_loop
  1689.     tst.l    d6            ;newpos
  1690.     bgt.b    .do_seek
  1691.     move.l    d7,d0            ;return old position
  1692.     bra.b    .exit
  1693. .do_seek
  1694.     move.l    (mfh_buffcontent,a5),d0
  1695.     ble.b    .read
  1696.     cmp.l    d6,d0
  1697.     bmi.b    .not_enough
  1698.     sub.l    d6,(mfh_buffcontent,a5)
  1699.     add.l    d6,(mfh_buffpos,a5)
  1700.     add.l    d6,(mfh_filepos,a5)
  1701.     moveq    #0,d6
  1702.     bra.b    .seek_loop
  1703. .not_enough
  1704.     sub.l    d0,d6
  1705.     add.l    d0,(mfh_filepos,a5)
  1706. .read
  1707.     move.l    (a5),a0
  1708.     move.l    (mfh_xbuff,a5),a1
  1709.     move.l    a1,(mfh_buffpos,a5)
  1710.     move.l    (mfh_xbuffsize,a5),d0
  1711.     CALLXPK    XpkRead
  1712.     move.l    d0,(mfh_buffcontent,a5)
  1713.     beq.b    .eof
  1714.     bgt.b    .seek_loop
  1715.     move.l    d0,(xpk_error,a4)
  1716.     bra.w    .exit
  1717. .eof    moveq    #-1,d0            ;ERROR (EOF)
  1718.     bra.w    .exit
  1719.  
  1720.  
  1721.  
  1722. ;***_XClose*********************************************************
  1723. ; parameters:
  1724. ;  a0 - myFH (should be safe to call several times unlike DOS/Close()!!)
  1725. _xclose
  1726.     movem.l    d1-a6,-(a7)
  1727.     move.l    a0,a5
  1728.  
  1729.     move.l    (a5),d1
  1730.     beq.b    .no_fh
  1731.     clr.l    (a5)
  1732.     tst    (mfh_is_xpk,a5)
  1733.     bne.b    .is_xpk
  1734.     CALLDOS    Close
  1735.     bra.b    .no_fh
  1736. .is_xpk    move.l    (xpkbase,pc),d0
  1737.     beq.b    .no_fh
  1738.     move.l    d0,a6
  1739.     move.l    d1,a0
  1740.     CALL    XpkClose
  1741. .no_fh
  1742.     lea    (mfh_xbuff,a5),a0
  1743.     move.l    (a0),d0
  1744.     beq.b    .no_xbuff
  1745.     clr.l    (a0)
  1746.     move.l    d0,a1
  1747.     CALLEXEC FreeVec
  1748. .no_xbuff
  1749.     movem.l    (a7)+,d1-a6
  1750.     rts
  1751.  
  1752.  
  1753.  
  1754.  
  1755. ;--------------------------------------
  1756. ; exit
  1757. ende
  1758.     tst    (audioopen,a4)
  1759.     beq.b    .noaudio
  1760.     lea    ($dff000),a5
  1761.     move    #$780,d0
  1762.     move    d0,(intena,a5)
  1763.     moveq    #0,d0
  1764.     move    d0,(aud0vol,a5)
  1765.     move    d0,(aud1vol,a5)
  1766.     move    d0,(aud2vol,a5)
  1767.     move    d0,(aud3vol,a5)
  1768.     move    #$000f,(dmacon,a5)
  1769.     move.l    (4.w),a6
  1770.     move.l    (oldlevel4,pc),d0
  1771.     beq.b    .noint
  1772.     moveq    #7,d0        ;INTB_AUD0
  1773.     move.l    (oldlevel4,pc),a1
  1774.     CALL    SetIntVector
  1775. .noint    move.l    (ioreq,pc),a1
  1776.     CALL    CloseDevice
  1777. .noaudio
  1778.     move.l    (mytask,pc),d0
  1779.     beq.b    .nopri
  1780.     move.l    d0,a1
  1781.     move.l    (oldpri,pc),d0
  1782.     CALLEXEC SetTaskPri
  1783. .nopri
  1784.     move.l    (ioreq,pc),d0
  1785.     beq.b    .noioreq
  1786.     move.l    d0,a0
  1787.     CALLEXEC DeleteIORequest
  1788. .noioreq
  1789.     move.l    (msgport,pc),d0
  1790.     beq.b    .nomsgport
  1791.     move.l    d0,a0
  1792.     CALLEXEC DeleteMsgPort
  1793. .nomsgport
  1794.  
  1795.     move.l    (signal,pc),d0
  1796.     moveq    #-1,d1
  1797.     cmp.l    d0,d1
  1798.     beq.b    .nosignal
  1799.     CALLEXEC FreeSignal
  1800. .nosignal
  1801.     move.l    (rdargs,pc),d1
  1802.     beq.b    .noargs
  1803.     CALLDOS    FreeArgs
  1804. .noargs
  1805.  
  1806.     lea    (smpfh1,pc),a0
  1807.     bsr.w    _XClose
  1808.     lea    (smpfh2,pc),a0
  1809.     bsr.w    _XClose
  1810.  
  1811.     move.l    (xpkbase,pc),d0
  1812.     beq.b    .noxpklib
  1813.     move.l    d0,a1
  1814.     CALLEXEC CloseLibrary
  1815. .noxpklib
  1816.     move.l    (utilitybase,pc),d0
  1817.     beq.b    .noutillib
  1818.     move.l    d0,a1
  1819.     CALLEXEC CloseLibrary
  1820. .noutillib
  1821.     move.l    (iconbase,pc),d0
  1822.     beq.b    .noiconlib
  1823.     move.l    d0,a1
  1824.     CALLEXEC CloseLibrary
  1825. .noiconlib
  1826.     move.l    (buffspt,pc),d0
  1827.     beq.b    .nostereobuff
  1828.     move.l    d0,a1
  1829.     CALLEXEC FreeVec
  1830. .nostereobuff
  1831.     move.l    (loadallvec,pc),d0
  1832.     beq.b    .notloadall
  1833.     move.l    d0,a1
  1834.     CALLEXEC FreeVec
  1835. .notloadall
  1836.     move.l    (oldcurrdir,pc),d1
  1837.     beq.b    .nocurrdir
  1838.     CALLDOS    CurrentDir
  1839. .nocurrdir
  1840.     move.l    (intuiwindow,pc),d0
  1841.     beq.b    .nowin
  1842.     move.l    d0,a0
  1843.     CALLINT    CloseWindow
  1844. .nowin
  1845.     move.l    (pubscreen,pc),d0
  1846.     beq.b    .nopubscr
  1847.     sub.l    a0,a0
  1848.     move.l    d0,a1
  1849.     CALLINT    UnlockPubScreen
  1850. .nopubscr
  1851.     move.l    (conwindow,pc),d7
  1852.     beq.b    .nocon
  1853.     move.l    d7,d1
  1854.     lea    (anykeytxt,pc),a0
  1855.     move.l    a0,d2
  1856.     CALLDOS    FPutS
  1857.     move.l    d7,d1
  1858.     CALL    FGetC
  1859.     move.l    d7,d1
  1860.     CALL    Close
  1861. .nocon
  1862.     move.l    (wbmsg,pc),d0
  1863.     beq.b    .nowbmsg
  1864.     move.l    d0,a1
  1865.     CALLEXEC ReplyMsg
  1866. .nowbmsg
  1867.     move.l    (error,pc),d0
  1868.     rts
  1869. err_ende
  1870.     lea    (error+2,pc),a0
  1871.     move    #10,(a0)
  1872.     bra.w    ende
  1873.  
  1874.  
  1875.  
  1876. ;--------------------------------------
  1877. ; data area
  1878.  
  1879. dosnam        dc.b    "dos.library",0
  1880. gfxnam        dc.b    "graphics.library",0
  1881. utilnam        dc.b    "utility.library",0
  1882. iconnam        dc.b    "icon.library",0
  1883. xpknam        dc.b    "xpkmaster.library",0
  1884. rtnam        dc.b    "reqtools.library",0
  1885. intuinam    dc.b    "intuition.library",0
  1886. audionam    dc.b    "audio.device",0
  1887. connam        dc.b    "CON://// PSMP window",0
  1888. filereqtitle    dc.b    "PSMP: select IFF-8SVX file",0
  1889. filereqtags    dc.l    0
  1890. dosbase        dc.l    0
  1891. gfxbase        dc.l    0
  1892. utilitybase    dc.l    0
  1893. iconbase    dc.l    0
  1894. xpkbase        dc.l    0
  1895. intuitionbase    dc.l    0
  1896. read_busy    dc    0
  1897. is_stereo    dc    0
  1898. smpfh1        blk.b    mfh_SIZEOF,0
  1899. smpfh2        blk.b    mfh_SIZEOF,0
  1900. oldlevel4    dc.l    0
  1901. wbmsg        dc.l    0
  1902. output        dc.l    0
  1903. conwindow    dc.l    0
  1904. oldcurrdir    dc.l    0
  1905. pubscreen    dc.l    0
  1906. intuiwindow    dc.l    0
  1907. loadallvec    dc.l    0
  1908.  
  1909. tt_rate        dc.b    "PLAYBACKRATE",0
  1910. tt_filter    dc.b    "FILTER",0
  1911. tt_repeat    dc.b    "REPEAT",0
  1912. tt_info        dc.b    "INFO",0
  1913. tt_loadall    dc.b    "LOADALL",0
  1914. tt_noprogress    dc.b    "NOPROGRESS",0
  1915. tt_noinfo    dc.b    "NOINFO",0
  1916. tt_pubscreen    dc.b    "PUBSCREEN",0
  1917. rdargs        dc.l    0
  1918. template    dc.b    "FILE,P=PLAYBACKRATE/K/N,F=FILTER/S,R=REPEAT/S,I=INFO/S,L=LOADALL/S,NP=NOPROGRESS/S,NI=NOINFO/S,PS=PUBSCREEN/K",0
  1919. args_start
  1920. filenamept    dc.l    0
  1921. playbackrate    dc.l    0
  1922. filter        dc.l    0
  1923. repeat        dc.l    0
  1924. info        dc.l    0
  1925. loadall        dc.l    0
  1926. noprogress    dc.l    0
  1927. noinfo        dc.l    0
  1928. pubscrnam    dc.l    0
  1929. args_end
  1930.  
  1931. idcmp_softint    dc.l    0,0        ;is_Node ln_Succ, ln_Pred
  1932.         dc.b    2,0        ;is_Node ln_Type, ln_Pri
  1933.         dc.l    0        ;is_Node ln_Name
  1934.         dc.l    0,check_idcmp    ;is_Data, is_Code
  1935.  
  1936. int_name    dc.b    "PSMP_AUDIO",0,0
  1937. int_struct    dc.l    0,0        ;is_Node ln_Succ, ln_Pred
  1938.         dc.b    2,0        ;is_Node ln_Type, ln_Pri
  1939.         dc.l    int_name    ;is_Node ln_Name
  1940.         dc.l    0,mylevel4    ;is_Data, is_Code
  1941.  
  1942. openwindow_tags
  1943. owt_left    dc.l    $80000064,0    ;WA_Left
  1944. owt_top        dc.l    $80000065,0    ;WA_Top
  1945. owt_width    dc.l    $80000076,300    ;WA_InnerWidth
  1946. owt_height    dc.l    $80000077,0    ;WA_InnerHeight
  1947.         dc.l    $8000006a,$200    ;WA_IDCMP: IDCMP_CloseWindow
  1948.         dc.l    $8000006b    ;WA_Flags:
  1949.             ;ACTIVATE+CLOSEGADGET+DRAGBAR+DEPTHGADET+NOCAREREFRESH+RMBTRAP+SMARTREFRESH+GIMMEZEROZERO
  1950.         dc.l    $1000+8+2+4+$20000+$10000+0+$400
  1951.         dc.l    $8000006e,vstr+6;WA_Title
  1952.         ;;;dc.l    $8000006f,vstr+6;WA_ScreenTitle
  1953. owt_pubscr    dc.l    $80000079,0    ;WA_PubScreen
  1954.         dc.l    TAG_DONE
  1955.  
  1956. packername    dc.b    0,0,0,0,0
  1957. xpkerrormsg    ds.b    XPKERRMSGSIZE+1
  1958.  
  1959. xpkerrtxtargs
  1960. xpk_error    dc.l    0
  1961.         dc.l    xpkerrormsg
  1962.  
  1963. xpktxt_args
  1964. packernamept    dc.l    packername
  1965. packerratio    dc.l    0
  1966. packerchszKB    dc.l    0
  1967.  
  1968. infotxt_args
  1969. bodylenKB    dc.l    0
  1970. rate        dc.l    0
  1971. stereostr    dc.l    0
  1972. compression    dc    0
  1973. compstr        dc.l    0
  1974. rate_arg    dc.l    0
  1975. rate_amiga    dc    0
  1976. rate_play    dc.l    0
  1977. minutes        dc    0
  1978. seconds        dc    0
  1979. millisec    dc    0
  1980.  
  1981. stereostart    dc.l    0
  1982. bodystart    dc.l    0
  1983. currpos        dc.l    0
  1984. bodylen        dc.l    0
  1985. bodyend        dc.l    0
  1986.  
  1987. error        dc.l    0
  1988. buff1pt        dc.l    buff1
  1989. buff2pt        dc.l    buff2
  1990. buff1size    dc.l    buffersize
  1991. buff2size    dc.l    buffersize
  1992. buffspt        dc.l    0
  1993. buffs1pt    dc.l    0
  1994. buffs2pt    dc.l    0
  1995. buffs1size    dc.l    buffersize
  1996. buffs2size    dc.l    buffersize
  1997. lbuffpt        dc.l    lbuff
  1998. filenamebuffpt    dc.l    filenam
  1999. filepart    dc.l    0
  2000. filepartlen    dc.l    0
  2001. filepartwidth    dc.l    0
  2002. fontheight    dc.l    0
  2003. timetxtwidth    dc.l    0
  2004. timetxtx    dc.l    0
  2005. timetxty    dc.l    0
  2006. timemin        dc.l    0
  2007. timesec        dc.l    0
  2008. pbleft        dc.l    0
  2009. pbright        dc.l    0
  2010. pbtop        dc.l    0
  2011. pbbot        dc.l    0
  2012. pbwidth        dc.l    0
  2013. pbcurrent    dc.l    0
  2014. playedbytes    dc.l    0
  2015. bytestoplay    dc.l    0
  2016.  
  2017. oldpri        dc.l    0
  2018. mytask        dc.l    0
  2019. signal        dc.l    -1
  2020. msgport        dc.l    0
  2021. ioreq        dc.l    0
  2022. channelmap    dc    $0f0f
  2023. audioopen    dc    0
  2024. oneshot_last    dc    0
  2025. firstirq    dc    0
  2026. playmode    dc    0    ;0=large ( > buffersize*2 )
  2027.                 ;else small ( < buffersize*2 )
  2028. initial_value    dc.b    0
  2029. initial_value2    dc.b    0
  2030.  
  2031.  
  2032. vstr        dc.b    "$VER: PSMP 0.9 (Tue 14-Jan-97)",0
  2033. maintxt        dc.b    27,"[1mPSMP 0.9 (Tue 14-Jan-97) by Smack/Infect",27,"[0m",10,0
  2034. filetxt        dc.b    " file......%s",10,0
  2035. xpktxt        dc.b    " XPK.......%s, %ld%% gain, chunksize %ld KB",10,0
  2036. infotxt        dc.b    " features..%ld KB, %ld Hz, %s, compression %d (%s)",10
  2037.         dc.b    " rate......%ld Hz -> period %d -> %ld Hz",10
  2038.         dc.b    " duration..%d min %02d.%03d sec",10,0
  2039. comp0txt    dc.b    "none",0
  2040. comp1txt    dc.b    "Fibonacci Delta",0
  2041. comp2txt    dc.b    "Exponential Delta",0
  2042. monotxt        dc.b    "mono",0
  2043. stereotxt    dc.b    "stereo",0
  2044. argwarntxt    dc.b    "** wrong arguments, using default.",10,0
  2045. audioerrtxt    dc.b    "** can't allocate audio channels.",10,0
  2046. readerrtxt    dc.b    "** read error.",10,0
  2047. comperrtxt    dc.b    "** unknown compression.",10,0
  2048. xpkerrtxt    dc.b    "** XPK error %ld: %s",10,0
  2049. xpkliberrtxt    dc.b    "** can't open xpkmaster.library.",10,0
  2050. memerrtxt    dc.b    "** not enough memory.",10,0
  2051. pubscrtxt    dc.b    "** can't lock public screen '%s'",10,0
  2052. anykeytxt    dc.b    10,"press return to continue.",0
  2053. timetxt        dc.b    " 00:00 / 00:00 "
  2054. timetxtlen=*-timetxt
  2055. timetxt_cm=timetxt+1
  2056. timetxt_cs=timetxt+1+3
  2057. timetxt_tm=timetxt+1+8
  2058. timetxt_ts=timetxt+1+11
  2059.  
  2060.     section    bbbb,bss_c
  2061. buff1    ds.b    buffersize
  2062. buff2    ds.b    buffersize
  2063.  
  2064.  
  2065.     section    cccc,bss
  2066. filenam    ds.b    1024
  2067. psnam    ds.b    256
  2068. lbuff    ds.b    buffersize
  2069.